/*
 * Copyright 2012 Gregor Schauer
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package at.schauer.gregor.vienna.convert.vienna.util;

import at.schauer.gregor.vienna.context.ViennaContext;
import at.schauer.gregor.vienna.context.ViennaContextAware;
import at.schauer.gregor.vienna.convert.factory.ConverterFactory;
import at.schauer.gregor.vienna.convert.factory.ConverterFactoryAware;
import at.schauer.gregor.vienna.convert.vienna.ViennaToStringStyle;
import at.schauer.gregor.vienna.convert.vienna.base.SeparatorConverter;
import at.schauer.gregor.vienna.serializer.Serializer;
import at.schauer.gregor.vienna.util.ViennaUtils;
import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.util.StringUtils;

import javax.annotation.Nonnull;
import java.lang.reflect.Array;

/**
 * @author Gregor Schauer
 */
@Deprecated
public class ArrayConverter implements SeparatorConverter<Object[]>, ConverterFactoryAware, ViennaContextAware {
	protected ViennaToStringStyle style = new ViennaToStringStyle();
	protected ViennaContext ctx;

	@Override
	public Object[] sourceToTarget(String source, Class<? extends Object[]> targetClass) {
		source = source.substring(source.indexOf(Serializer.CLASS_OBJECT_SEPARATOR) + 3, source.length() - 2);
		String[] fields = StringUtils.delimitedListToStringArray(source, getSeparator());
		Object[] target = (Object[]) Array.newInstance(targetClass.getComponentType(), fields.length);
		for (int i = 0; i < fields.length; i++) {
			try {
				String sourceElement = fields[i];
				Class clazz = ClassUtils.getClass(ViennaUtils.ConverterUtils.typeFromString(sourceElement));
				String value = ViennaUtils.ConverterUtils.valueFromString(sourceElement);
				Array.set(target, i, ViennaUtils.DeserializationUtils.load(ctx, clazz, value));
			} catch (ClassNotFoundException e) {
				throw new RuntimeException(e);
			}
		}
		return target;
	}

	@Override
	public String targetToSource(Object... target) {
		ToStringBuilder builder = new ToStringBuilder(target, style);
		builder.append(target);
		return builder.toString();
	}

	@Override
	public String getSeparator() {
		return style.getArraySeparator();
	}

	public void setSeparator(String separator) {
		style.setArraySeparator(separator);
	}

	@Override
	public void setViennaContext(ViennaContext viennaContext) {
		this.ctx = viennaContext;
	}

	@Override
	public void setConverterFactory(@Nonnull ConverterFactory converterFactory) {
//		converterFactory.register(Object[].class, this);
	}
}
